#include <stdio.h>
#include "mp4conf.h"
//#define MKTAG(a,b,c,d) (a | (b << 8) | (c << 16) | (d << 24))

/*
fopen() 打开流							fclose() 关闭流 
fputc() 写一个字符到流中				fgetc() 从流中读一个字符 
fseek() 在流中定位到指定的字符			fputs() 写字符串到流 
fgets() 从流中读一行或指定个字符		fprintf() 按格式输出到流 
fscanf() 从流中按格式读取				feof() 到达文件尾时返回真值 
ferror() 发生错误时返回其值				rewind() 复位文件定位器到文件开始处 
remove() 删除文件						fread() 从流中读指定个数的字符 
fwrite() 向流中写指定个数的字符			tmpfile() 生成一个临时文件流 
tmpnam() 生成一个唯一的文件名 
*/

FILE * mp4_fopen(const char * filename, const char *mode){
	return fopen(filename,mode);
}

int64_t mp4_ftell(FILE *pfile){
	return ftell(pfile);
}

void mp4_fseek(FILE *pfile,int64_t pos,int mode){
	fseek(pfile,pos,mode);
}

void mp4_fclose(FILE *pfile){
	fclose(pfile);
}

void put_byte(FILE *pfile, uint32_t i)
{
	uint8_t b=(char)i;
    fputc(b,pfile);
}

void put_be16(FILE *pfile,uint32_t val)
{
    put_byte(pfile, val >> 8);
    put_byte(pfile, val);
}

void put_be24(FILE *pfile, uint32_t val)
{
    put_be16(pfile, val >> 8);
    put_byte(pfile, val);
}

void put_be32(FILE *pfile,uint32_t val)
{
    put_byte(pfile, val >> 24);
    put_byte(pfile, val >> 16);
    put_byte(pfile, val >> 8);
    put_byte(pfile, val);
}

void put_be64(FILE *pfile,uint64_t val)
{
    put_be32(pfile, (uint32_t)(val >> 32));
    put_be32(pfile, (uint32_t)(val & 0xffffffff));
}


void put_tag(FILE *pfile,const char *tag)
{
    while (*tag) {
        put_byte(pfile, *tag++);
    }
}

void put_le32(FILE *pfile, uint32_t val)
{
    put_byte(pfile, val);
    put_byte(pfile, val >> 8);
    put_byte(pfile, val >> 16);
    put_byte(pfile, val >> 24);
}

void put_buffer(FILE *pfile, const uint8_t *buf, int size){
	int i=0;
	while (i<size) {
        put_byte(pfile,buf[i++]);
    }
}

void put_h264_buffer(FILE *pfile, const uint8_t *buf, int size){
	int i=0;
	if(size<=4)return;
	put_be32(pfile,size-4);
	for(i=4;i<size;i++) {
		put_byte(pfile,buf[i]);
    }
}
